from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response

from PAA_ERP.apps.erp_system.serializer.dept_serialzer import DeptSerializer
from PAA_ERP.apps.erp_system.serializer.permission_serialzer import PermissionsSerialzer
from PAA_ERP.utils.base_views import MultipleDestroyMixin
from erp_system.models import DeptModel

from PAA_ERP.utils.pagination import GlobalPagination


class DeptView(viewsets.ModelViewSet, MultipleDestroyMixin):
    """
    create:
    部门--新增

    部门新增, status: 201(成功), return: 新增部门信息

    destroy:
    部门--删除

    单个部门删除, status: 204(成功), return: None

    multiple_delete:
    部门--批量删除

    多个部门批量删除, status: 204(成功), return: None

    update:
    部门--修改,部门本身的信息

    部门修改, status: 200(成功), return: 修改后的角色信息

    partial_update:
    部门--局部修改(角色批量授权),只能真的某一个角色一次性授权，之前的的授权会被覆盖

    角色批量授权, status: 200(成功), return: 修改后的角色信息

    set_permission_to_role:
    部门--单个授权，一次只能授予角色一个permission，也可以取消一个permission

    status: 200(成功), return: 修改后的角色信息

    list:
    部门--获取所有部门,
    请求参数有pid：父部门的id。
    1.如果没有传pid，则查询所有部门，
    2.如果传过来的pid=0则查询顶级部门列表
    3.如果传过来的pid=非0，则查询某个父部门下的所有子部门列表
    status: 200(成功), return: 角色信息列表

    find_permissions_by_menu:
    查询属于指定菜单或者接口的部门列表，需要传参：menu_id.比如/find_permissions_by_menu/menu_id

    返回部门列表，status：200（成功），return：返回部门列表

    retrieve:
    查询单个部门

    返回单个部门，status：200（成功），return：返回部门列表
    """
    queryset = DeptModel.objects.all()
    serializer_class = DeptSerializer
    pagination_class = GlobalPagination  #分页
    def get_queryset(self):
        '''
            1.如果没有传pid，则查询所有部门，
            2.如果传过来的pid=0则查询顶级部门列表
            3.如果传过来的pid=非0，则查询某个父部门下的所有子部门列表
        '''
        pid = self.request.query_params.get('pid', None)
        if pid:
            integer_pid = int(pid)
            if integer_pid == 0:
                return DeptModel.objects.filter(parent__isnull=True).all()
            else:
                return DeptModel.objects.filter(parent__id=integer_pid).all()
        else:
            return DeptModel.objects.all()
